import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpEchoServer {
    private DatagramSocket socket=null;
    public UdpEchoServer(int port) throws SocketException {
        //指定一个固定的端口号，让服务器来使用。
        socket=new DatagramSocket(port);
    }
    public void start() throws IOException {
        //启动服务器
        System.out.println("服务器启动");
        while (true){
            //循环一次就相当于处理一次请求。
            //处理一次请求的过程，典型的服务器都是分成三个步骤的
            //1.读取请求并解析。
            //  DatagramOacket相当于一个UDp数据报，此处传入的字节数组，就相当于保存UDO的载荷部分。
            DatagramPacket requestPAcket=new DatagramPacket(new byte[4096],4095);
            socket.receive(requestPAcket);
            //读取的二进制数据，转换成字符串，只构造有效的部分。
            String request=new String(requestPAcket.getData(),0,requestPAcket.getLength());
            //2.根据有效的部分，计算响应。（服务器的关键步骤）
            //但这是个回显服务器这个步骤就省略了。
            String respose=pocess(request);
            //3.把回响返回给客户端
            //  根据respose构造DatagramPaket，发送给客户端。
            //此处不能使用respose.length（）
            DatagramPacket responsePacket=new DatagramPacket(respose.getBytes()
                    ,respose.getBytes().length,requestPAcket.getSocketAddress());
            socket.send(responsePacket);
            //4.打印一个日志
            System.out.printf("[%s : %d] req:%s, resp:%s\n" ,requestPAcket.getAddress().toString()
                    ,requestPAcket.getPort(),request,respose );
        }
    }

    private String pocess(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        UdpEchoServer server=new UdpEchoServer(9090);
        server.start();
    }
}
